iT邦幫忙

2021 iThome 鐵人賽

DAY 17
1
自我挑戰組

C 語言筆記系列 第 17

[C 語言筆記--Day17] 讓一個絕對不會 return 的 function 進行一點優化

  • 分享至 

  • xImage
  •  

今天在 TLPI 看到這個寫法,於是來紀錄一下。

大綱

  1. 什麼情況會讓一個 function 絕對不會 return
  2. 不會 return ,所以呢?
  3. __attribute__((xxxx)) 語法
  4. __attribute__((noreturn))

1. 什麼情況會讓一個 function 絕對不會 return

通常是處理 error 的 function,處理完之後直接 exit()

所以在寫的時候已經確定他不會 return 了

以下是一個例子:

void err_exit(const char *err_msg);

void
err_exit(const char *err_msg)
{
    fprintf(stderr, "%c", err_msg);
    exit(1);
}

他 print 出錯誤訊息之後就會 exit 了,

所以絕對不會 return

2. 不會 return ,所以呢?

因為不會 return 所以 compiler 對於這個點有個優化的空間,

但前題是:寫程式的人必須要先告訴 compiler 這個 function 有不會 return 的特性

而以下就要說明要如何告訴 compiler 這個點

3. __attribute__((xxxx)) 語法

例:

int foo() __attribute__((xxxx));   /* 要把 xxxx 替換掉 */ 

代表的就是 foo() 這個 function 有 xxxx 這個特性 (attribute)

compiler 可以針對這個 xxxx 的 attribute 來進行優化

至於 xxxx 實際上可以填上哪些 attribute ,

可參考這個網頁

4. __attribute__((noreturn))

noreturn 就是其中一個 attribute

他代表的是這個 function 不會 return

所以剛剛的例子可以改成:

void err_exit(const char *err_msg) __attribute__ ((noreturn));

void
err_exit(const char *err_msg)
{
    fprintf(stderr, "%c", err_msg);
    exit(1);
}

這樣寫的話,compiler 就知道他可以完全不考慮這個 function 要如何 return 的問題

可以針對這點進行一點優化

參考資料


上一篇
[C 語言筆記--Day16] 紀錄前幾天寫錯的東西
下一篇
[C 語言筆記--Day18] 用 linked list 實作 merge sort
系列文
C 語言筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言